/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package entities;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author Smuggler
 */
@Entity
@Table(name = "alquileres")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Alquileres.findAll", query = "SELECT a FROM Alquileres a"),
    @NamedQuery(name = "Alquileres.findByAll", query = "SELECT a FROM Alquileres a "
        + "WHERE a.idUnidadAlojamiento = :idUnidadAlojamiento AND a.idCliente = :idCliente "
        + "AND a.fechaArribo = :fechaArribo AND a.fechaPartida = :fechaPartida"),
    @NamedQuery(name = "Alquileres.findByIdAlquiler", query = "SELECT a FROM Alquileres a WHERE a.idAlquiler = :idAlquiler"),
    @NamedQuery(name = "Alquileres.findByTipoAlquiler", query = "SELECT a FROM Alquileres a WHERE a.tipoAlquiler = :tipoAlquiler"),
    @NamedQuery(name = "Alquileres.findByFechaArribo", query = "SELECT a FROM Alquileres a WHERE a.fechaArribo = :fechaArribo"),
    @NamedQuery(name = "Alquileres.findByFechaPartida", query = "SELECT a FROM Alquileres a WHERE a.fechaPartida = :fechaPartida"),
    @NamedQuery(name = "Alquileres.findByMontoTotal", query = "SELECT a FROM Alquileres a WHERE a.montoTotal = :montoTotal"),
    @NamedQuery(name = "Alquileres.findByMontoReserva", query = "SELECT a FROM Alquileres a WHERE a.montoReserva = :montoReserva"),
    @NamedQuery(name = "Alquileres.findDetalleAlquiler", query = "SELECT a FROM Alquileres a WHERE (((a.fechaArribo <= :fecha) AND (a.fechaPartida >= :fecha)) AND (a.idUnidadAlojamiento.nombre = :nombre) AND ((a.tipoAlquiler = 'R') OR (a.tipoAlquiler = 'F') OR (a.tipoAlquiler = 'O')))"),
    @NamedQuery(name = "Alquileres.findReservas", query = "SELECT a FROM Alquileres a WHERE (a.montoReserva = 0) AND (a.idCliente.idCliente != 1)"),
    @NamedQuery(name = "Alquileres.findAlquileresNoLiquidados", query = "SELECT a FROM Alquileres a WHERE (a.montoReserva < a.montoTotal) and (a.montoReserva > 0)"),
    @NamedQuery(name = "Alquileres.findAlquileresConSaldoAFavor", query = "SELECT a FROM Alquileres a WHERE a.montoReserva > a.montoTotal"),
    @NamedQuery(name = "Alquileres.findEntreFechas", query = "SELECT a FROM Alquileres a WHERE  ((a.fechaArribo <= :fechaFin) AND (a.fechaPartida >= :fechaInicio))"),
    @NamedQuery(name = "Alquileres.findEntreFechasSinCancelado", query = "SELECT a FROM Alquileres a WHERE  ((a.fechaArribo <= :fechaFin) AND (a.fechaPartida >= :fechaInicio)) AND (a.tipoAlquiler != 'C')AND ((a.idAlquiler != :idAlquiler)) AND (a.idUnidadAlojamiento = :UnidadAlojamiento)"),
    @NamedQuery(name = "Alquileres.findSiExisteAlquiler", query = "SELECT a FROM Alquileres a WHERE  (((a.fechaArribo <= :fechaFin) AND (a.fechaPartida >= :fechaInicio)) AND (a.idUnidadAlojamiento = :UnidadAlojamiento))AND ((a.tipoAlquiler = :tipoalquiler) OR (a.tipoAlquiler = :tipoalquiler2)) AND ((a.idAlquiler != :idAlquiler))"),
    @NamedQuery(name = "Alquileres.findEntreFechasSinCancelados", query = "SELECT a FROM Alquileres a WHERE  ((a.fechaArribo <= :fechaFin) AND (a.fechaPartida >= :fechaInicio)  AND ((a.tipoAlquiler = 'R') OR (a.tipoAlquiler = 'F') OR (a.tipoAlquiler = 'O') OR (a.tipoAlquiler = 'M')))"),
    @NamedQuery(name = "Alquileres.findCantidadOcupadosEntreFechas", query = "SELECT count(a) FROM Alquileres a WHERE  ((a.fechaArribo <= :fechaFin) AND (a.fechaPartida >= :fechaInicio) AND (a.idUnidadAlojamiento.nombre = :numeroDepto))"),
    @NamedQuery(name = "Alquileres.findByTodo", query = "SELECT a "
    + "FROM Alquileres a "
    + "WHERE  ((UPPER(CONCAT(a.idCliente.apellido, a.idCliente.nombres)) LIKE UPPER(CONCAT('%',:apellidoCliente, '%')) OR (:apellidoCliente = ''))) "
    + "AND ((a.idUnidadAlojamiento = :UnidadAlojamiento) OR (:UnidadAlojamiento IS NULL))"
    + "AND ((a.fechaArribo <= :fechaFin) AND (a.fechaPartida >= :fechaInicio) OR ((:fechaFin is NULL) OR (:fechaInicio is NULL)))"
    + "AND ((a.tipoAlquiler = :tipoalquiler) OR (a.tipoAlquiler = :tipoalquiler2)) "
    + "ORDER BY a.fechaArribo DESC"),
    @NamedQuery(name = "Alquileres.findByMantenimiento", query = "SELECT a "
    + "FROM Alquileres a "
    + "WHERE  ((a.idUnidadAlojamiento = :UnidadAlojamiento) OR (:UnidadAlojamiento is NULL))"
    + "AND ((a.fechaArribo <= :fechaFin) AND (a.fechaPartida >= :fechaInicio) OR ((:fechaFin is NULL) OR (:fechaInicio is NULL)))"
    + "AND ((a.tipoAlquiler = :tipoalquiler)) "
    + "ORDER BY a.fechaArribo DESC"),
    @NamedQuery(name = "Alquileres.findCantidadOcupadosEntreFechasSinCancelados", query = "SELECT count(a) FROM Alquileres a WHERE  ((a.fechaArribo <= :fechaFin) AND (a.fechaPartida >= :fechaInicio) AND (a.idUnidadAlojamiento.nombre = :numeroDepto)  AND ((a.tipoAlquiler = 'R') OR (a.tipoAlquiler = 'F')OR (a.tipoAlquiler = 'M') OR (a.tipoAlquiler = 'O')) )"),
    @NamedQuery(name = "Alquileres.findByCantidadPersonas", query = "SELECT a FROM Alquileres a WHERE a.cantidadPersonas = :cantidadPersonas")})
public class Alquileres implements Serializable {

    @Transient
    private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idAlquiler")
    private Integer idAlquiler;
    @Basic(optional = false)
    @Column(name = "tipoAlquiler")
    private String tipoAlquiler;
    @Basic(optional = false)
    @Column(name = "fechaArribo")
    @Temporal(TemporalType.DATE)
    private Date fechaArribo;
    @Basic(optional = false)
    @Column(name = "fechaPartida")
    @Temporal(TemporalType.DATE)
    private Date fechaPartida;
    @Basic(optional = false)
    @Column(name = "montoTotal")
    private Double montoTotal = Double.valueOf(0.0);
    @Basic(optional = false)
    @Column(name = "montoReserva")
    private Double montoReserva = Double.valueOf(0.0);
    @Basic(optional = false)
    @Column(name = "cantidadPersonas")
    private int cantidadPersonas;
    @JoinColumn(name = "idUnidad_Alojamiento", referencedColumnName = "idUnidad")
    @ManyToOne(optional = false)
    private UnidadesAlojamiento idUnidadAlojamiento;
    @JoinColumn(name = "idCliente", referencedColumnName = "idCliente")
    @ManyToOne(optional = false)
    private Clientes idCliente;

    public Alquileres() {
    }

    public Alquileres(Integer idAlquiler) {
        this.idAlquiler = idAlquiler;
    }

    public Alquileres(Integer idAlquiler, String tipoAlquiler, Date fechaArribo, Date fechaPartida, Double montoTotal, Double montoReserva, int cantidadPersonas) {
        this.idAlquiler = idAlquiler;
        this.tipoAlquiler = tipoAlquiler;
        this.fechaArribo = fechaArribo;
        this.fechaPartida = fechaPartida;
        this.montoTotal = montoTotal;
        this.montoReserva = montoReserva;
        this.cantidadPersonas = cantidadPersonas;
    }

    public Integer getIdAlquiler() {
        return idAlquiler;
    }

    public void setIdAlquiler(Integer idAlquiler) {
        Integer oldIdAlquiler = this.idAlquiler;
        this.idAlquiler = idAlquiler;
        changeSupport.firePropertyChange("idAlquiler", oldIdAlquiler, idAlquiler);
    }

    public String getTipoAlquiler() {
        return tipoAlquiler;
    }

    public void setTipoAlquiler(String tipoAlquiler) {
        String oldTipoAlquiler = this.tipoAlquiler;
        this.tipoAlquiler = tipoAlquiler;
        changeSupport.firePropertyChange("tipoAlquiler", oldTipoAlquiler, tipoAlquiler);
    }

    public Date getFechaArribo() {
        return fechaArribo;
    }

    public void setFechaArribo(Date fechaArribo) {
        Date oldFechaArribo = this.fechaArribo;
        this.fechaArribo = fechaArribo;
        changeSupport.firePropertyChange("fechaArribo", oldFechaArribo, fechaArribo);
    }

    public Date getFechaPartida() {
        return fechaPartida;
    }

    public void setFechaPartida(Date fechaPartida) {
        Date oldFechaPartida = this.fechaPartida;
        this.fechaPartida = fechaPartida;
        changeSupport.firePropertyChange("fechaPartida", oldFechaPartida, fechaPartida);
    }

    public Double getMontoTotal() {
        return montoTotal;
    }

    public void setMontoTotal(Double montoTotal) {
        Double oldMontoTotal = this.montoTotal;
        this.montoTotal = montoTotal;
        changeSupport.firePropertyChange("montoTotal", oldMontoTotal, montoTotal);
    }

    public Double getMontoReserva() {
        return montoReserva;
    }

    public void setMontoReserva(Double montoReserva) {
        Double oldMontoReserva = this.montoReserva;
        this.montoReserva = montoReserva;
        changeSupport.firePropertyChange("montoReserva", oldMontoReserva, montoReserva);
    }

    public int getCantidadPersonas() {
        return cantidadPersonas;
    }

    public void setCantidadPersonas(int cantidadPersonas) {
        int oldCantidadPersonas = this.cantidadPersonas;
        this.cantidadPersonas = cantidadPersonas;
        changeSupport.firePropertyChange("cantidadPersonas", oldCantidadPersonas, cantidadPersonas);
    }

    public UnidadesAlojamiento getIdUnidadAlojamiento() {
        return idUnidadAlojamiento;
    }

    public void setIdUnidadAlojamiento(UnidadesAlojamiento idUnidadAlojamiento) {
        UnidadesAlojamiento oldIdUnidadAlojamiento = this.idUnidadAlojamiento;
        this.idUnidadAlojamiento = idUnidadAlojamiento;
        changeSupport.firePropertyChange("idUnidadAlojamiento", oldIdUnidadAlojamiento, idUnidadAlojamiento);
    }

    public Clientes getIdCliente() {
        return idCliente;
    }

    public void setIdCliente(Clientes idCliente) {
        Clientes oldIdCliente = this.idCliente;
        this.idCliente = idCliente;
        changeSupport.firePropertyChange("idCliente", oldIdCliente, idCliente);
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idAlquiler != null ? idAlquiler.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Alquileres)) {
            return false;
        }
        Alquileres other = (Alquileres) object;
        if ((this.idAlquiler == null && other.idAlquiler != null) || (this.idAlquiler != null && !this.idAlquiler.equals(other.idAlquiler))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entities.Alquileres[ idAlquiler=" + idAlquiler + " ]";
    }

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        changeSupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        changeSupport.removePropertyChangeListener(listener);
    }
}
